import cv2


def show_img(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


img = cv2.imread('graph.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 为了更高的准确率，使用二值图像。
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
show_img('thresh', thresh)

# 高版本不会第一个参数binary了，只会返回后两个
# binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) # 低版本
"""
    cv2.findContours(img,mode,method)
    mode:轮廓检索模式
    - RETR_EXTERNAL ：只检索最外面的轮廓；
    - RETR_LIST：检索所有的轮廓，并将其保存到一条链表当中；
    - RETR_CCOMP：检索所有的轮廓，并将他们组织为两层：顶层是各部分的外部边界，第二层是空洞的边界;
    - RETR_TREE：检索所有的轮廓，并重构嵌套轮廓的整个层次;（最常用）
    
    method:轮廓逼近方法
    - CHAIN_APPROX_NONE：以Freeman链码的方式输出轮廓，所有其他方法输出多边形（顶点的序列）。
    - CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分，也就是，函数只保留他们的终点部分。
"""
# thresh: 二值图像, cv2.RETR_TREE: 检测所有轮廓, cv2.CHAIN_APPROX_NONE: 绘制所有的点
# contours：返回所有轮廓点, hierarchy：返回所有结构
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
# 下面需要contours这个轮廓信息
# print(np.array(contours).shape)

# 传入绘制图像，轮廓，轮廓索引，颜色模式，线条厚度
# 注意需要copy,要不原图会变。。。
draw_img = img.copy()
# 绘制轮廓  -1：代表所有轮廓   (0, 0, 255)：BGR, 2：线条宽度
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 1)
show_img('res', res)